package cn.rslee.scala.demos

object CollectionsApp extends App  {
  
	// 每一种集合类型基本使用也就是CRUD
  // 1.列表List.Scala里面的List长度是不可变的，你无法对List里面添加或者删除元素
  // 这一种设计与scala分布式并行计算模型有关，分布式计算的情况下面，要求所有节点处理的数据是一致不变的
  //对List进行新增、删除、更新只能得到新的List对象
  
  val numbers = List(1 to 100)
  //遍历
  numbers.foreach { x => println(x) }
  numbers.foreach(x => println(x))
  numbers.foreach(println _)
  //甚至你可以这样
  numbers foreach println
  
  //传统的for循环
  for(x <- numbers){
    println(x)
  }
  //基于下标访问
  for(i <- 0 until numbers.length){
	  println("index:"+i+":"+numbers(i))
  }
  
  // 空列表
  val entiy = Nil  
  // 基于::创建List，这里其实一共创建了4个List对象，然后取最后一个
  val names = "eason"::"tony"::"green"::Nil
  //两个List拼接
  val names2 = names ::: List("edwin")
//  val names4 = names2 ::: names // 这种语法是不行的
  
  println(names)
  println(names2)
  
  //获取长度为5的数量
  println(names2.count { x => x.length >=5 })
  // 过滤
  println(names2.filter { x => x.length() == 4 })
  // 去掉头一个
  println(names2.drop(1))
  // 去掉尾一个
  println(names2.dropRight(1))
  
  // 判断是否存在某个元素
  println(names2.exists { x => x.equals("eason") })
  
  // 取得第一元素
  println(names2.head)
  // 最后一个
  println(names2.last)
  //去除第一个元素
  println(names2.tail)
  //去除最后一个
  println(names2.init)
  
  // 遍历所有的元素,翻转，转换成新的对象
  println(names2.map(s =>{val n = s+"-start";n.reverse}))
  
  println(numbers.map(n =>{val s = n+"";s}))// 不知道为什么只能转换成String类型的
  
  // 生成用逗号隔开的字符串
  println(names2.mkString(", "))
  // 反序
  println(names2.reverse)
  
  // 排序，按照字母递增
  println(names2.sortWith((x:String,y:String) => x.compareTo(y) < 0))
  // 等价下面的写法
  println(names2.sortWith( _.compareTo(_) < 0))

}